package com.hjy.backend.versionManager;

import com.hjy.backend.transactionManager.TransactionManagerImpl;

import java.util.HashMap;
import java.util.Map;

/**
 * versionManager 对一个事务的抽象, 记录了对应的事务等级, 事务号, 以及该事务创建时有哪些其他事务没有被提交(不可见事务)
 */
public class Transaction {
    public long xid; // 事务号
    public int level; // 事务等级, 0: 读提交, 1: 可重复读
    public Map<Long, Boolean> snapshot; // 对于这个事务创建时的状态来说, 当前活跃的事务(未提交), 也就是快照
    public Exception err;
    public boolean autoAborted;

    /**
     * 创建一个基于VersionManager 的抽象事务, 这个事务是对事务类的抽象, 因为记录了当其创造时的活跃事务
     *
     * @param xid
     * @param level
     * @param active
     * @return
     */
    public static Transaction newTransaction(long xid, int level, Map<Long, Transaction> active) {
        Transaction t = new Transaction();
        t.xid = xid;
        t.level = level;
        if (level != 0) {
            t.snapshot = new HashMap<>();
            for (Long x : active.keySet()) {
                t.snapshot.put(x, true);
            }
        }
        return t;
    }

    /**
     * 基于当前快照, 这个事务是否提交了(true为未提交)
     *
     * @param xid
     * @return
     */
    public boolean isInSnapshot(long xid) {
        if (xid == TransactionManagerImpl.SUPER_XID) {
            return false;
        }
        return snapshot.containsKey(xid);
    }
}
